package idv.jieh.commons.util;

/**
 * <p>Title: Exentric Package Version 1.0</p>
 * <p>Description: 這個類別可以讓你在查詢資料後，如果想將相同的 Key 值整理成一群資料時可以用到。</p>
 * <p>Copyright: Copyright (c) 2002</p>
 * <p>Company: Exentric</p>
 * @author jieh
 * @version 1.0<br> - class release 2002-1-23 by jieh<br> - document release 2003-06-26 by Fin
 */
import idv.jieh.commons.comm.BasicClass;

public class KeyKeeper extends BasicClass{
  private int l = 0;
  private Object[] keys, nextKeys;

  /**
   * 建構子。<p>
   * 在物件建構時必須告知要設定的 Keys Object 總數。
   * @param size 要建購的大小。
   */
  public KeyKeeper(int size) {
    l = size;
    keys = new Object[l];
    nextKeys = new Object[l];
    for(int i=0; i<l; i++){
      keys[i] = new String();
      nextKeys[i] = new String();
    }
  }

  /**
   * 設定第一組的 Keys Object 。<p>
   * @param idx 指定要設定第幾個 key。
   * @param obj 相對應的 Key Object 。
   */
  public void setKey(int idx, Object obj){
    keys[idx] = obj;
  }

  /**
   * 設定第二組 Key Object。<p>
   * 設定要和第一組的 Keys Object 比對的 Keys Object 。
   * @param idx 指定要設定第幾個 key。
   * @param obj 相對應的 Key Object 。
   */
  public void setNextKey(int idx, Object obj){
    nextKeys[idx] = obj;
  }

  /**
   * 比對第一組與第二組 Keys Object。<br>
   * 比較兩者是否相同。適用於比較前後兩值是否被改變過。
   * @return true : 第一組 Keys Object 與第二組 Keys Object 不同；
   *    false:兩組 Keys Object 相同。
   */
  public boolean isChange(){
    for(int i=0; i<l; i++){
      if(!nextKeys[i].equals(keys[i])){
        return true;
      }
    }
    return false;
  }

  /**
   * Keys Object 轉移。<p>
   * 將第二組的 Keys Object 轉到第一組的 Keys Object，並還原第二組值。
   */
  public void shift(){
    for(int i=0; i<l; i++){
      keys[i] = nextKeys[i];
      nextKeys[i] = "";
    }
  }

  /**
   * 取得指定第一組的 Key 值。<p>
   * @param idx 指定的位置。
   * @return Key 值。
   */
  public String getKey(int idx){
    return keys[idx].toString();
  }

  /**
   * 取得指定第二組的 Key 值。<p>
   * @param idx 指定的位置。
   * @return Key 值。
   */
  public String getNextKey(int idx){
    return nextKeys[idx].toString();
  }

  /**
   * 顯示現有所有 Key 與 Object。<p>
   * 覆寫父類別的方法，另外用比較有意義的文字表達這個物件的內容。
   * @return 描述這個物件的文字內容。
   */
  public String toString(){
    StringBuffer k1 = new StringBuffer("\n");
    StringBuffer k2 = new StringBuffer();

    for(int i=0; i<l; i++){
      k1.append("[").append(keys[i]).append("]");
      k2.append("[").append(nextKeys[i]).append("]");
    }
    k1.append("\n").append(k2);

    return k1.toString();
  }

/*************************** 以下為測試區 ***************************
  public static void main(String[] args){
    KeyKeeper me = new KeyKeeper(3);
    me.setKey(0, "0817");
    me.setKey(2, "test");
    System.out.println(me.toString());
    System.out.println("Is Change : "+me.isChange());
    me.setNextKey(0, "0817");
    me.setNextKey(2, "test");
    System.out.println(me.toString());
    System.out.println("Is Change : "+me.isChange());
    me.setNextKey(0, "test2");
    System.out.println(me.toString());
    System.out.println("Is Change : "+me.isChange());

  }
//*/

}// class end
